package httpx

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"net/http"
)

type Context struct {
	*gin.Context
	//session *Session
	Session sessions.Session
	Token   *Token
	layer   int
}

type Token struct {
	context *Context
}

const __Context = "__Context"

// newContext 创建Context实例
func newContext(c *gin.Context) *Context {
	ctx := &Context{Context: c, layer: 0}
	ctx.Session = sessions.Default(c)
	ctx.Token = &Token{
		context: ctx,
	}
	c.Set(__Context, ctx) // 保存上下文
	return ctx
}

// getContext 获取或者创造Context实例
func getContext(c *gin.Context) *Context {
	ctx, exists := c.Get(__Context)
	if !exists {
		return newContext(c)
	}
	return ctx.(*Context)
}

// Free 释放引用
func (c *Context) Free() {
	if c.layer == 0 { // 判断是否可以释放
		c.Set(__Context, nil)
		//c.session.context = nil
		c.Session = nil
		c.Token.context = nil
		c.Token = nil
	}
}

// Next 执行下一个中间件或者执行接口
func (c *Context) Next() {
	c.layer++ // 层次增加
	c.Context.Next()
	c.layer-- // 层次减少
}

// Abort 终止执行
func (c *Context) Abort() {
	c.Context.Abort()
	c.layer = 0 // 层次归0
}

// Send 发送数据到客户端
func (c *Context) Send(data any) {
	c.JSON(http.StatusOK, data)
}
